package main
import (
	"fmt"
)
//关于方法的课堂练习

type MethodUtils struct{
	//打印矩形
}
func (m MethodUtils)draw(){
	for i:=0;i<8;i++{
		for j:=0;j<10;j++{
			fmt.Printf("*")
		}
		fmt.Println()
	}
}
func (m MethodUtils)draw2(l , w int){
	for i:=0;i<l;i++{
		for j:=0;j<w;j++{
			fmt.Printf("*")
		}
		fmt.Println()
	}
}

func main(){
	var method MethodUtils
	method.draw()
	//------------
	method.draw2(3,3)
}
//注意：
/*
1、如果是普通函数，且参数为为值类型，那么就不能用指针类型的变量作为参数（会报错），反之亦然
2、如果方法（struct的方法）的接收者是值类型时【func（m MethodUtils）test()】虽然通过（&m）.test()传地址的形式调用该方法，但仍然是值拷贝
   如果方法（struct的方法）的接收者是指针类型时【func（m *MethodUtils）test()】，那么通过传地址的形式是可以改变原数据，
   但如果你传的是值类型，底层也会自动添加地址符也就是（&m）.test()和m.test()是一样的效果
   
   总结上面第二点：对于方法（struct的方法），接收者为值类型时，可以直接用指针类型的变量调用方法，反之亦然！！！！！！！！
    真正决定是值拷贝还是地址拷贝，看这个方法是和哪个类型绑定！（有没有 *）
*/